home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / ADVANCED / HALOED.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  6.0 KB  |  275 lines

  1.  
  2. /* haloed.c - by Tom McReynolds, SGI */
  3.  
  4. /* Draw haloed lines. */
  5.  
  6. #include <GL/glut.h>
  7. #include <math.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10.  
  11. enum {CONE = 1};
  12.  
  13. /* Draw a cone */
  14. void
  15. cone(void)
  16. {
  17.   glPushMatrix();
  18.   glTranslatef(0.f, 0.f, -30.f);
  19.   glCallList(CONE);
  20.   glPopMatrix();
  21. }
  22.  
  23. /* Draw a torus */
  24. void
  25. torus(void)
  26. {
  27.   glutSolidTorus(10., 20., 16, 16);
  28. }
  29.  
  30. enum {FILL, WIRE, HALO, OFFSET_HALO, BACKFACE_HALO, TOGGLE};
  31.  
  32. int rendermode = FILL;
  33.  
  34. void (*curobj)(void) = cone;
  35.  
  36. void
  37. menu(int mode)
  38. {
  39.   if(mode == TOGGLE)
  40.     if(curobj == cone)
  41.       curobj = torus;
  42.     else
  43.       curobj = cone;
  44.   else
  45.     rendermode = mode;
  46.   glutPostRedisplay();
  47. }
  48.  
  49. int winWidth = 512;
  50. int winHeight = 512;
  51.  
  52. /* used to get current width and height of viewport */
  53. void
  54. reshape(int wid, int ht)
  55. {
  56.   glViewport(0, 0, wid, ht);
  57.   winWidth = wid;
  58.   winHeight = ht;
  59. }
  60.  
  61. GLfloat viewangle;
  62.  
  63.  
  64. void
  65. redraw(void)
  66. {
  67.     /* clear stencil each time */
  68.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  69.  
  70.     glPushMatrix();
  71.     glRotatef(viewangle, 0.f, 1.f, 0.f);
  72.  
  73.     switch(rendermode) {
  74.     case FILL:
  75.       curobj();
  76.       break;
  77.     case WIRE:
  78.       glDisable(GL_DEPTH_TEST);
  79.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  80.       glLineWidth(3.f);
  81.       curobj();
  82.       glLineWidth(1.f);
  83.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  84.       glEnable(GL_DEPTH_TEST);
  85.       break;
  86.     case HALO:
  87.       /* draw wide lines into depth buffer */
  88.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  89.       glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
  90.       glLineWidth(9.f);
  91.       curobj();
  92.  
  93.       /* draw narrow lines into color with depth test on */
  94.       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  95.       glLineWidth(3.f);
  96.       glDepthFunc(GL_LEQUAL);
  97.       curobj();
  98.       glDepthFunc(GL_LESS);
  99.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  100.       glLineWidth(1.f);
  101.       break;
  102.     case OFFSET_HALO:
  103.       /* draw wide lines into depth buffer */
  104.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  105.       glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
  106.       glLineWidth(9.f);
  107.       curobj();
  108.  
  109.       /* draw narrow lines into color with depth test on */
  110.       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  111.       glLineWidth(3.f);
  112. #if GL_EXT_polygon_offset
  113.       glEnable(GL_POLYGON_OFFSET_EXT);
  114.       glPolygonOffsetEXT(-.5f, -.02f);
  115. #endif
  116.       glDepthFunc(GL_LEQUAL);
  117.       curobj();
  118.       glDepthFunc(GL_LESS);
  119. #if GL_EXT_polygon_offset
  120.       glDisable(GL_POLYGON_OFFSET_EXT);
  121. #endif
  122.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  123.       glLineWidth(1.f);
  124.       break;
  125.     case BACKFACE_HALO: /* cheat: only works on single non-intersecting obj */
  126.       /* draw wide lines into depth buffer */
  127.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  128.       glEnable(GL_CULL_FACE);
  129.       glCullFace(GL_FRONT);
  130.       glLineWidth(3.f);
  131.  
  132.       curobj();
  133.  
  134.       /* mask out borders of objects with wide gray lines */
  135.       glCullFace(GL_BACK);
  136.       glLineWidth(9.f);
  137.       glDisable(GL_LIGHTING);
  138.       glColor3f(.7f, .7f, .7f);
  139.  
  140.       curobj();
  141.  
  142.       /* draw front face narrow lines without depth test */
  143.       glEnable(GL_LIGHTING);
  144.       glLineWidth(3.f);
  145.       glDisable(GL_DEPTH_TEST);
  146.  
  147.       curobj();
  148.  
  149.       /* clean up */
  150.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  151.       glEnable(GL_DEPTH_TEST);
  152.       glDisable(GL_CULL_FACE);
  153.       glLineWidth(1.f);
  154.       break;
  155.     }
  156.  
  157.     glPopMatrix();
  158.     glutSwapBuffers();
  159.  
  160.     if(glGetError())
  161.       printf("oops! Bad gl command!\n");
  162. }
  163.  
  164. /* animate scene by rotating */
  165. enum {ANIM_LEFT, ANIM_RIGHT};
  166. int animDirection = ANIM_LEFT;
  167.  
  168. void anim(void)
  169. {
  170.   if(animDirection == ANIM_LEFT)
  171.     viewangle -= 1.f;
  172.   else
  173.     viewangle += 1.f;
  174.   glutPostRedisplay();
  175. }
  176.  
  177. /* ARGSUSED1 */
  178. /* special keys, like array and F keys */
  179. void special(int key, int x, int y)
  180. {
  181.   switch(key) {
  182.   case GLUT_KEY_LEFT:
  183.     glutIdleFunc(anim);
  184.     animDirection = ANIM_LEFT;
  185.     break;
  186.   case GLUT_KEY_RIGHT:
  187.     glutIdleFunc(anim);
  188.     animDirection = ANIM_RIGHT;
  189.     break;
  190.   case GLUT_KEY_UP:
  191.   case GLUT_KEY_DOWN:
  192.     glutIdleFunc(0);
  193.     break;
  194.   }
  195. }
  196.  
  197. /* ARGSUSED1 */
  198. void
  199. key(unsigned char key, int x, int y)
  200. {
  201.   switch(key) {
  202.   case 'a':
  203.     viewangle -= 10.f;
  204.     glutPostRedisplay();
  205.     break;
  206.   case 's':
  207.     viewangle += 10.f;
  208.     glutPostRedisplay();
  209.     break;
  210.   case '\033':
  211.     exit(0);
  212.   }
  213. }
  214.  
  215.  
  216. int picked_object;
  217. int xpos = 0, ypos = 0;
  218. int newxpos, newypos;
  219. int startx, starty;
  220.  
  221. int
  222. main(int argc, char **argv)
  223. {
  224.     static GLfloat lightpos[] = {25.f, 50.f, -50.f, 1.f};
  225.     static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  226.     GLUquadricObj *cone, *base;
  227.  
  228.     glutInit(&argc, argv);
  229.     glutInitWindowSize(512, 512);
  230.     glutInitDisplayMode(GLUT_STENCIL|GLUT_DEPTH|GLUT_DOUBLE);
  231.     (void)glutCreateWindow("haloed lines");
  232.     glutDisplayFunc(redraw);
  233.     glutKeyboardFunc(key);
  234.     glutSpecialFunc(special);
  235.  
  236.     glutCreateMenu(menu);
  237.     glutAddMenuEntry("Filled Object", FILL);
  238.     glutAddMenuEntry("Wireframe", WIRE);
  239.     glutAddMenuEntry("Haloed Wireframe", HALO);
  240.     glutAddMenuEntry("Pgon Offset Haloed Wireframe", OFFSET_HALO);
  241.     glutAddMenuEntry("Backface Haloed Wireframe", BACKFACE_HALO);
  242.     glutAddMenuEntry("Toggle Object", TOGGLE);
  243.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  244.  
  245.  
  246.     glEnable(GL_DEPTH_TEST);
  247.     glEnable(GL_LIGHTING);
  248.     glEnable(GL_LIGHT0);
  249.  
  250.     glClearColor(.7f, .7f, .7f, .7f);
  251.  
  252.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  253.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  254.   
  255.  
  256.     /* make display list for cone; for efficiency */
  257.  
  258.     glNewList(CONE, GL_COMPILE);
  259.     cone = gluNewQuadric();
  260.     base = gluNewQuadric();
  261.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  262.     gluQuadricOrientation(base, GLU_INSIDE);
  263.     gluDisk(base, 0., 25., 8, 1);
  264.     gluCylinder(cone, 25., 0., 60., 8, 8);
  265.     gluDeleteQuadric(cone);
  266.     gluDeleteQuadric(base);
  267.     glEndList();
  268.  
  269.     glMatrixMode(GL_PROJECTION);
  270.     glOrtho(-50., 50., -50., 50., -50., 50.);
  271.     glMatrixMode(GL_MODELVIEW);
  272.     glutMainLoop();
  273.     return 0;             /* ANSI C requires main to return int. */
  274. }
  275.